import time
import traceback
from qturboframe.lib.utils.by import By
from qturboframe.lib.webdriver.exceptions import SeleniumError
from qturboframe.lib.report.log import logger
from BladeFerm.hui_app.hui_lib.menu import Menu as HuiMenu
from .home_tab import HomeTab
from qturboframe.public_ui.binding_menu_options import binding_menu_vue
from qturboframe.lib.common.web_config import web_config

class Menu(HuiMenu):
    '''
    选择到详细菜单页面。
    '''

    def check_open_menu(self, name, page_tabs_list=None):
        '''
        判断菜单是否已经被打开
        :param name: 菜单名称
        :param page_tabs_list:
        :return:
        '''
        web_config.last_menu = name
        # 当前菜单打开但是当前页面不为当前菜单，进行刷新
        if page_tabs_list and name in page_tabs_list:
            HomeTab(name, self._driver).reload()
        # 确认菜单已经打开
        timeout = 0
        while timeout < self.timeout:
            if HomeTab(name, self._driver).element:
                logger.debug('{} 菜单页已经打开！'.format(name))
                break
            else:
                timeout = timeout + 0.1
        else:
            raise SeleniumError('未打开{} 菜单页！'.format(name))

    @binding_menu_vue
    def select_second(self, linkText):
        '''
        数据运营中心>统一资讯系统风格：菜单栏菜单选择。
        数据统一咨询云服务 进行修改，使其可以适应任何长度的菜单而非2级菜单。同时对面包屑的操作变为如果有的话，删除所有面包屑
        :Args:
         - linkText: 菜单栏链接名称集合，按照顺序点击链接

        :Raises:
            SeleniumError: 菜单操作失败
        '''
        try:
            valuelist = linkText.split('/')
            # 判断菜单页面是否已经打开，打开则刷新，未打开则打开菜单
            page_tabs = self._driver.find_elements_by_attribute('css selector', 'a.tabs-view')
            page_tabs_list = list()
            [page_tabs_list.append(page_tab.text) for page_tab in page_tabs]
            open_page_tab = self._driver.exist('css selector', 'a.tabs-view.router-link-active', timeout=0.1)
            page_name = open_page_tab.text
            print('page_name',page_name)
            # 如果有面包屑，统统关闭
            if len(page_tabs_list)>1:
                HomeTab(page_tabs_list[-1],self._driver).close_all()
            # 菜单选择  根据菜单层级 能展开则展开
            for valuemenu in valuelist:
                logger.debug(valuemenu)
                #可能存在同名的菜单列，这里选择该路径的最后一个（即最底层的路径）
                menu_ul = self._element.find_elements_by_attribute(By.CSS_SELECTOR, 'div.sidebar-menu',
                                                                    'text:' +valuemenu, timeout=self.timeout)[-1]
                menu_ul.focus()
                expand_icon = menu_ul.exist(By.CSS_SELECTOR, 'div.post-icon>i')
                if expand_icon ==None:
                    menu_ul.click()
                    logger.info(f'打开目标菜单：{valuemenu}')
                else:
                    if "icon-unfold" in expand_icon.get_attribute("class"):
                        expand_icon.click()
                        logger.info(f'展开级菜单：{valuemenu}')
            #self.check_open_menu(valuelist[-1], page_tabs_list)
        except Exception as E:
            logger.error(E)
            traceback.print_exc()
            raise SeleniumError(str(E))

    @binding_menu_vue
    def select_third(self, linkText):
        '''
        数据运营中心>统一资讯系统风格：菜单栏菜单选择。
        数据统一咨询云服务 进行修改，使其可以适应任何长度的菜单而非2级菜单。同时对面包屑的操作变为如果有的话，删除所有面包屑
        :Args:
         - linkText: 菜单栏链接名称集合，按照顺序点击链接

        :Raises:
            SeleniumError: 菜单操作失败
        '''
        try:
            valuelist = linkText.split('/')
            # 判断菜单页面是否已经打开，打开则刷新，未打开则打开菜单
            page_tabs = self._driver.find_elements_by_attribute('css selector', 'a.tabs-view')
            page_tabs_list = list()
            [page_tabs_list.append(page_tab.text) for page_tab in page_tabs]
            logger.debug(page_tabs_list)
            open_page_tab = self._driver.exist('css selector', 'a.tabs-view.router-link-active', timeout=0.1)
            page_name = open_page_tab.text
            print('page_name',page_name)
            # 如果有面包屑，统统关闭
            if len(page_tabs_list)>1:
                HomeTab(page_tabs_list[-1],self._driver).close_all()
            # 菜单选择  根据菜单层级 能展开则展开
            for valuemenu in valuelist:
                logger.debug(valuemenu)
                #可能存在同名的菜单列，这里选择该路径的最后一个（即最底层的路径）
                menu_ul = self._element.find_elements_by_attribute(By.CSS_SELECTOR, 'div.sidebar-menu',
                                                                   'text:' +valuemenu, timeout=self.timeout)[-1]
                menu_ul.focus()
                expand_icon = menu_ul.exist(By.CSS_SELECTOR, 'div.post-icon>i')
                if expand_icon ==None :
                    #只有路径末尾才需要点击
                    if valuemenu==valuelist[-1]:
                        menu_ul.click()
                        logger.info(f'打开目标菜单：{valuemenu}')
                else:
                    if "icon-unfold" in expand_icon.get_attribute("class"):
                        expand_icon.click()
                        logger.info(f'展开级菜单：{valuemenu}')
            #self.check_open_menu(valuelist[-1], page_tabs_list)
        except Exception as E:
            logger.error(E)
            traceback.print_exc()
            raise SeleniumError(str(E))


    @binding_menu_vue
    def select_firstpage(self, linkText):
        '''
        数据运营中心>统一资讯系统风格：菜单栏菜单选择。

        :Args:
         - linkText: 菜单栏链接名称集合，按照顺序点击链接

        :Raises:
            SeleniumError: 菜单操作失败
        '''
        try:
            valuelist = linkText.split('/')
            # 判断菜单页面是否已经打开，打开则刷新，未打开则打开菜单
            page_tabs = self._driver.find_elements_by_attribute('css selector', 'a.tabs-view')
            page_tabs_list = list()
            [page_tabs_list.append(page_tab.text) for page_tab in page_tabs]
            open_page_tab = self._driver.exist('css selector', 'a.tabs-view.router-link-active', timeout=0.1)
            page_name = open_page_tab.text
            print('page_name',page_name)
            # 当已经在菜单栏页面时进行刷新，否则重新进入菜单(弹框判断)
            first_menu_ul = self._element.find_element_by_attribute(By.CSS_SELECTOR, 'div.sidebar-menu',
                                                                    'text:' + valuelist[0], timeout=self.timeout)
            first_menu_ul.click()
            logger.info(f'打开目标菜单：{valuelist[0]}')
        except Exception as E:
            logger.error(E)
            traceback.print_exc()
            raise SeleniumError(str(E))
